package com.cskaoyan.javase.string._1notvar;

/**
 * @description: String对象不可变
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Scanner;

/**
 * 请键盘录入一个任意字符串s，并用一个temp字符串引用也指向它。
 * 这个时候修改temp字符串的内容，请问s字符串的内容会随之改变吗？
 *
 * String底层是如何存储字符串的? 它使用一个 private final char value[]; char类型的value数组来存储字符
 * 在堆空间中String对象中装char类型数组的引用指向一个堆上的char数组对象
 * 一旦想要修改字符串对象的内容,就需要更改value数组,但是value数组是final修饰的,这意味着:
 *        1.value引用是常量,不能指向另一个value数组
 *        2.value数组的内容仍然可以修改
 *
 * 虽然value数组的内容修改,但实际上修改字符串对象的内容不是通过修改value数组内容实现的,原因在于数组对的长度不可变,依赖于修改数组内容来更改字符串对象内容,限制太大了.数组长度短了不够用,长了浪费空间
 *
 * 现在value已经不能指向新的数组了,数组内容也不能修改了,只能够重新创建一个String对象,创建一个新的value数组,所以String对象的内容一旦发生改变,都会重新创建对象,而原本的String对象不会发生任何变化,这就是所谓的String对象不可变
 *
 *
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一行字符串:");
        String s = sc.nextLine();
        String temp = s;

        temp = "你好中国";
        System.out.println(s);
    }
}
